package site.addzero.util

import org.koin.core.annotation.Single
import site.addzero.cli.setting.SettingContext.DOTFILES_DIR
import site.addzero.cli.setting.SettingContext.HOME_DIR
import java.io.File

@Single
class TargetPathResolver {
    /**
     * 解析目标路径，保持文件在家目录中的相对结构
     *
     * @param sourcePath 源文件的绝对路径
     * @return 目标路径，保持与家目录中的相对结构
     */
    fun resolveTargetPath(sourcePath: String): String {
        // 规范化源路径
        val normalizedSourcePath = normalizePath(sourcePath)
        
        // 如果源路径在HOME_DIR下，则保持相对结构
        val normalizedHomeDir = normalizePath(HOME_DIR)
        if (normalizedSourcePath.startsWith(normalizedHomeDir)) {
            // 获取相对于家目录的路径部分
            val relativePath = normalizedSourcePath.substring(normalizedHomeDir.length).trimStart(File.separatorChar)
            // 构造目标路径，保持相同的目录结构
            return File(DOTFILES_DIR, relativePath).absolutePath
        }
        
        // 如果源路径不在HOME_DIR下，则直接放在DOTFILES_DIR根目录下
        val fileName = File(normalizedSourcePath).name
        return File(DOTFILES_DIR, fileName).absolutePath
    }
    
    /**
     * 规范化路径，处理多余的斜杠
     */
    private fun normalizePath(path: String): String {
        // 处理路径中的多余斜杠，但保留协议部分的双斜杠（如http://, file://等）
        var normalized = path
        // 处理开头的斜杠
        normalized = normalized.replace(Regex("^" + Regex.escape(File.separator) + "+"), File.separator)
        // 处理中间和末尾的多余斜杠
        normalized = normalized.replace(Regex(Regex.escape(File.separator) + "+"), File.separator)
        // 处理目录遍历符号
        normalized = normalized.replace(Regex(Regex.escape(File.separator) + "\\." + Regex.escape(File.separator)), File.separator)
        // 处理结尾的斜杠（除非是根目录）
        if (normalized.length > 1) {
            normalized = normalized.trimEnd(File.separatorChar)
        }
        return normalized
    }
}